"""
字典工具函数
用于从系统字典中获取数据，替代硬编码的枚举值
"""
from typing import Dict, List, Optional, Tuple
from django.core.cache import cache
from django.db import transaction
from system.models import DictType, DictData


def get_dict_data_by_type(dict_type_value: str, use_cache: bool = True) -> List[Dict[str, str]]:
    """
    根据字典类型获取字典数据列表
    
    Args:
        dict_type_value: 字典类型值
        use_cache: 是否使用缓存
        
    Returns:
        字典数据列表，每个元素包含label和value
    """
    cache_key = f"dict_data:{dict_type_value}"
    
    # 如果使用缓存，先尝试从缓存获取
    if use_cache:
        cached_data = cache.get(cache_key)
        if cached_data:
            return cached_data
    
    try:
        # 从数据库获取字典类型
        dict_type = DictType.objects.get(value=dict_type_value, status=1)
        
        # 获取该类型下的所有有效字典数据
        dict_data_list = DictData.objects.filter(
            dict_type=dict_type,
            status=1
        ).order_by('sort', 'id')
        
        # 转换为列表格式
        result = [
            {
                'label': item.label,
                'value': item.value,
                'color_type': item.color_type,
                'css_class': item.css_class
            }
            for item in dict_data_list
        ]
        
        # 如果使用缓存，将结果存入缓存
        if use_cache:
            cache.set(cache_key, result, timeout=3600)  # 缓存1小时
            
        return result
    except DictType.DoesNotExist:
        return []


def get_dict_label_by_value(dict_type_value: str, dict_value: str, default: str = "") -> str:
    """
    根据字典类型和值获取标签
    
    Args:
        dict_type_value: 字典类型值
        dict_value: 字典值
        default: 默认值
        
    Returns:
        字典标签
    """
    dict_data_list = get_dict_data_by_type(dict_type_value)
    
    for item in dict_data_list:
        if item['value'] == dict_value:
            return item['label']
    
    return default


def get_dict_choices(dict_type_value: str) -> List[Tuple[str, str]]:
    """
    获取字典数据，格式化为Django choices格式
    
    Args:
        dict_type_value: 字典类型值
        
    Returns:
        Django choices格式的列表
    """
    dict_data_list = get_dict_data_by_type(dict_type_value)
    
    return [
        (item['value'], item['label'])
        for item in dict_data_list
    ]


def clear_dict_cache(dict_type_value: Optional[str] = None):
    """
    清除字典缓存
    
    Args:
        dict_type_value: 字典类型值，如果为None则清除所有字典缓存
    """
    if dict_type_value:
        cache.delete(f"dict_data:{dict_type_value}")
    else:
        # 清除所有字典缓存（需要实现更复杂的逻辑）
        keys = cache.keys("dict_data:*")
        cache.delete_many(keys)


def init_dict_type_if_not_exists(dict_type_value: str, dict_type_name: str) -> DictType:
    """
    如果字典类型不存在，则创建它
    
    Args:
        dict_type_value: 字典类型值
        dict_type_name: 字典类型名称
        
    Returns:
        字典类型对象
    """
    dict_type, created = DictType.objects.get_or_create(
        value=dict_type_value,
        defaults={
            'name': dict_type_name,
            'status': 1
        }
    )
    
    return dict_type


def init_dict_data_if_not_exists(
    dict_type_value: str,
    dict_type_name: str,
    dict_data_list: List[Dict[str, str]]
) -> None:
    """
    初始化字典数据，如果不存在则创建
    
    Args:
        dict_type_value: 字典类型值
        dict_type_name: 字典类型名称
        dict_data_list: 字典数据列表，每个元素包含label、value等字段
    """
    with transaction.atomic():
        # 确保字典类型存在
        dict_type = init_dict_type_if_not_exists(dict_type_value, dict_type_name)
        
        # 创建或更新字典数据
        for index, data in enumerate(dict_data_list):
            DictData.objects.get_or_create(
                dict_type=dict_type,
                value=data['value'],
                defaults={
                    'label': data['label'],
                    'sort': data.get('sort', index + 1),
                    'status': 1,
                    'color_type': data.get('color_type', ''),
                    'css_class': data.get('css_class', ''),
                }
            )
        
        # 清除缓存
        clear_dict_cache(dict_type_value)